<?php
	/**
	 * 将数组 $params 的值导入到对象 $obj 中
	 * <br/>此函数仅用于简单对象，即不包含其它对象的复杂对象。仅导入数组存在的同名var
	 * @param array $params  源数组
	 * @param mixed $obj 目标对象
	 */
function webmethod_put_object_vars(array &$params,$obj){
		if (count ( $params ) == 0 || ! is_object ( $obj ))	return;
		foreach ( $params as $key => $val )
		  if (isset($val) && property_exists( $obj,$key ))
		     $obj->$key = $val;
}
	
	/**
	 * 数组编码xml字符串，xml字符串如<orders><order orderid="97913707" merchantid="6619" 
	 * paysum="32.90" isdeleted="0" ispaid="0" status="1" merchantorderid="" /></orders>
	 * <br/>数组内容使用urlencode编码。
	 * <br/>原如果解析失败，抛出Execption异常
	 * @param string $xmlString xml字符串
	 * @param array $arr 解析后的结果数组
	 */
function webmethod_array2xml(array $data){
        reset($data);
        list($key,$val)=each($data);
        $valstr='';
        _webmethod_array2xml_pumpArray($val,$valstr,$key);
        $key=trim($key);
		return '<'.$key.'>' . $valstr . '</' . $key . '>';
}
   //----webmethod_array2xml private function ------//
   function _webmethod_array2xml_pumpArray(array &$dataarr,&$resultstr,$parentKey=NULL){
		$key_is_int=false;
		foreach($dataarr as $key=>$val){
			if(is_array($val) && count($val)>0){
				$valstr=''; 
				$now_key_is_int=_webmethod_array2xml_pumpArray($val,$valstr,$key);
				if(is_int($key)){
				  $key_is_int=true;
				  $resultstr .='<'.$parentKey.'>'.urlencode($valstr).'</'.$parentKey.'>';
				}
				else if(! $now_key_is_int){
				  $key=trim($key);
 			      $resultstr .='<'.$key.'>'.urlencode($valstr).'</'.$key.'>';
				}
 			    else {
 			     $resultstr .= urlencode($valstr);
 			    }
				 
			}
			else{
				$key=trim($key);
				$val=htmlspecialchars($val);
				$resultstr .='<'.$key.'>'.urlencode($val).'</'.$key.'>';
			}  
		}
		return $key_is_int;		
    }
    
	/**
	 * xml字符串解析为数组，xml字符串如<orders><order orderid="97913707" merchantid="6619" 
	 * paysum="32.90" isdeleted="0" ispaid="0" status="1" merchantorderid="" /></orders>
	 * <br/>如果不是xml字符串，不解析。<br/>原如果解析失败，抛出Execption异常
	 * @param string $xmlString xml字符串
	 * @param array $arr 解析后的结果数组
	 */
function webmethod_xml2array(&$xmlString,array &$arr){
		$xmlString=trim($xmlString);
		if(strpos($xmlString,'<')!==0) return false; //simple test is xml
		try{
		  $root =new SimpleXMLElement($xmlString);
		  $name=$root->getName();
		  $resultarr=array();
		  _webmethod_xml2array_fillArray($root,$resultarr);
		  $arr[$name]=$resultarr; //set return val form
		  return true;
		}catch (Exception $e){
			throw new Exception('返回xml解析错误:' . $e->getMessage());
		}
}	
	//----webmethod_xml2array private function ------//
	function _webmethod_xml2array_fillArray($root,array &$resultarr){
		if(! $root) return;
		$rootarr=get_object_vars($root);
		foreach ($rootarr as $key=>$val) {
			 if(is_object($val)){
				$newarr=array();
				_webmethod_xml2array_fillArray($val,$newarr);
			 	if(count($newarr) >0 )  $resultarr[$key]=$newarr;
			 	else  $resultarr[$key]=NULL;
			}
			else if(is_array($val) && count($val)>0){//is array
				$valarr=array();
				for($i=0;$i<count($val);$i++){
					$v=$val[$i];
					if(is_object($v)){
						$newarr=array();
					    _webmethod_xml2array_fillArray($v,$newarr);
					    $valarr[]=$newarr;
					}
					else
					  $valarr[]=$v;
				}
				$resultarr[$key]=$valarr;
			}
			else
			 $resultarr[$key]=$val;
		}		
	}